/**
 * Socket服务器模块
 * 用于即时消息处理
 * 事件通知:
 * 	login
 * 	screen
 * 	logout
 *  plugin
 * 	sessionMessage
 * 	session
 * 
 * 
 * @version 0.0.1
 */
var _ljs=require("./mmlog").root("[sever/socket.js]");

var socket = require("socket.io");
var util = require("./util");
var pluginManager = require("./pluginManager");

var SckIO = null;


var Sockets = new Map();

module.exports = {

	/**
	 * 服务初始化 
	 * @param {Object} server http.createServer()
	 * @param {Object} app express()
	 */
	init: function(server,app) {
		_ljs.debug("初始化socket")
		var _this=this;
		SckIO = socket.listen(server);
		
		if (SckIO) {
			SckIO.on("connect", function(_socket) {
				_ljs.info("客户端WebSocket连接成功");
				//监听客户端注销事件（业务功能）
				_socket.on("logout", function(data) {
					_ljs.info("客户端注销登陆:",data.clientId);
					Sockets.del(data.clientId);
				});
				
				//监听客户端屏幕分享事件（业务功能）
				_socket.on("screen", function(data) {
					_this.sck(data.id,"screen",data.data);
				});
				
				//监听客户端登陆事件（业务功能）
				_socket.on("login", function(data) {
					var id = data.clientId;
					Sockets.set(id, _socket);
					_socket.emit("plugin", pluginManager.load());
					_ljs.info("坐席登陆:", id);
				})
			})
		}
	},

	/**
 	 * 向所有已连接的用户推送消息 
 	 * 请使用emit方法替代
 	 * @deprecated
	 * @param {Object} data
	 */
	all:function(data){
		Sockets.forEach(function(key,value,_map){
			key.emit("plugin",data);
		})
	},
	
	push: function(clientId, data) {
		Sockets.get(clientId).emit("message", data);
	},
	
	/**
	 * @deprecated
	 * @param {Object} id
	 * @param {Object} event
	 * @param {Object} data
	 */
	sck:function(id,event,data){
		if(id=="all"){
			Sockets.forEach(function(key,value,_map){
				key.emit(event,data);
			})
			return 
		}
		return Sockets.get(id).emit(event,data);
	},
	
	del:function(id){
		Sockets.delete(id);
	},

	/**
	 * 推送会话
	 * @param {Object} clientId socket客户端id
	 * @param {Object} data
	 */
	session: function(clientId, data) {
		_ljs.info("推送会话:", clientId, data);
		Sockets.get(clientId).emit("session", data);
	},
	
	/**
	 * 推送会话消息
	 * @param {Object} clientId socket客户端id
	 * @param {Object} data
	 */
	sessionMessage: function(clientId, data) {
		_ljs.debug("推送消息:%s=%o", clientId, data);
		try {
			Sockets.get(clientId).emit("sessionMessage", data);
			return true;
		} catch (e) {
			_ljs.error("消息所属的会话Socket不存在",e);
			return false;
		}
	},
	
	/**
	 * 触发客户端事件
	 * @param {String} eventName 事件名称
	 * @param {Object} data 发送数据
	 * @param {String} clientId 响应客户端ID  可以为空 空的时候是所有的
	 */
	emit:function(eventName,data,clientId){
		if(clientId){
			_ljs.debug("服务端向客户端Socket触发事件:",clientId);
			try{
				Sockets.get(clientId).emit(eventName, data);			
			}catch(e){
				_ljs.error("事件所属Sokcet客户端已离线:",clientId);
				_ljs.error("触发事件失败:",e);
			}
		}else{
			_ljs.debug("服务端向客户端Socket触发事件:[ALL]");
			SckIO.sockets.emit(eventName, data);
		}
	}
}